package core

import (
	"fmt"
	"log"
	"net/rpc"
	"os"
	"push_course/src/data"
	"push_course/src/entity"
	"strings"
	"sync"
	"time"
)

type TaskManager struct {
	taskList []entity.Task
}

// 创建一个任务管理器
func NewTaskManager() *TaskManager {
	return &TaskManager{}
}

// 添加子任务
func (self *TaskManager) AddTask(sub *entity.Task) *TaskManager {
	self.taskList = append(self.taskList, *sub)
	return self
}

func (self *TaskManager) And() *TaskManager {
	return self
}

// recycle 生命周期
func (this *TaskManager) Start() {
	var wg sync.WaitGroup
	wg.Add(1)
	ticker := time.NewTicker(1 * time.Second)

	go func() {
		// 恢复
		defer func() {
			if p := recover(); p != nil {
				log.Print(fmt.Sprintf("panic:%s", p))
			}
		}()

		// 时钟周期
		for range ticker.C {
			for i := 0; i < len(this.taskList); i++ {
				t := time.Now()
				now := fmt.Sprintf("%v:%v:%v", t.Hour(), t.Minute(), t.Second())
				go this.taskList[i].Callback(t, now)
			}
		}
	}()

	go func() {
		this.showInfo()
		log.Println("服务已启动...")
	}()

	wg.Wait()
}

// 查看所有触发器
func (this *TaskManager) showInfo() {
	fmt.Println("============子任务列表==========")
	for index := range this.taskList {
		log.Println(fmt.Sprintf("task[%v]:%v %v", index+1, this.taskList[index].Callback, this.taskList[index].Comment))
	}
	fmt.Println("==============================")

	// 如果是参数传入 代表只查看触发器不启动服务
	for _, v := range os.Args {
		if strings.EqualFold(v, "-l") {
			os.Exit(-1)
		}
	}

	// 检测rpc服务端是否可用
	client, err := rpc.DialHTTP("tcp", data.RPC_ADDR)
	if err != nil {
		log.Panic("rpc server panic:", err)
	}
	defer client.Close()
	log.Println("推送服务连接成功...")

}
